<!DOCTYPE html>
<html>

  <head>
    <meta charset='utf-8' />
    <meta http-equiv="X-UA-Compatible" content="chrome=1" />
    <meta name="description" content="HTTPS設定ファイル生成ツール" />

    <link rel="stylesheet" type="text/css" media="screen" href="../stylesheets/stylesheet.css">
    <title>HTTPS設定ファイル生成ツール0.5(ベータ版)</title>
<!-- for pkcs5pkey -->
<script language="JavaScript" type="text/javascript" src="../jsrsasign-all-min.js"></script>

<script language="JavaScript" type="text/javascript">
/********************************************
 * 各種ガイドラインでの暗号スイートの定義
 ********************************************/
var OPENSSL_CIPHERSUITE = {
  "kjur201511": "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:DES-CBC3-SHA",
  "cryptrec1": "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256",
  "cryptrec2": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-GCM-SHA384",
  "cryptrec3": "DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA:RC4-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA",
  "mozilla1": "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK",
  "mozilla2": "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA",
 "mozilla3": "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA",
  "bullet1": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:EDH-RSA-DES-CBC3-SHA",
  "bullet2": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:EDH-RSA-DES-CBC3-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA:ECDHE-RSA-RC4-SHA:RC4-SHA",
  "qualysblog": "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS",
  "openssl_default": "DEFAULT",
  "redhat_default": "HIGH:!aNULL:!MD5:!RC4",
  "centos6_default": "ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW",
  "ubuntu12_default": "HIGH:MEDIUM:!aNULL:!MD5",
  "general_default": "ALL:!aNULL:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM",
};

/********************************************
 * 各サーバー(バージョン)の設定テンプレート
 ********************************************/
var CFG_TEMPLATE = {
/* Apache 2.4系テンプレート */
"apache24": 
(function() {/*
# sample ssl.conf for Apache 2.4
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TranferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol %%%PROTOCOL%%%
SSLCipherSuite %%%CIPHERSUITE%%%
%%%CIPHERORDER%%%
SSLCertificateFile conf/ssl/server.crt
SSLCertificateKeyFile conf/ssl/server.key
%%%COMPRESSION%%%
# Public Key Pinningを有効にするにはコメントアウトを外して下さい
#Header always set Public-Key-Pins "%%%KEYPINNING%%%"
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
</VirtualHost>
*/}).toString().match(/\/\*([^]*)\*\//)[1],
/* Apache 2.2系テンプレート */
"apache22": 
(function() {/*
# sample ssl.conf for Apache 2.2
LoadModule ssl_module modules/mod_ssl.so
Listen 443
SSLPassPhraseDialog  builtin
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TranferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol %%%PROTOCOL%%%
SSLCipherSuite %%%CIPHERSUITE%%%
%%%CIPHERORDER%%%
SSLCertificateFile conf/ssl/server.crt
SSLCertificateKeyFile conf/ssl/server.key
SSLCertificateChainFile conf/ssl/chain.crt
%%%COMPRESSION%%%
# Public Key Pinningを有効にするにはコメントアウトを外して下さい
#Header always set Public-Key-Pins "%%%KEYPINNING%%%"
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
</VirtualHost>
*/}).toString().match(/\/\*([^]*)\*\//)[1],

/* nginx テンプレート */
"nginx":
(function() {/*
# /etc/nginx/conf.d/ssl.conf - 生成されたNginx SSL設定ファイル
server {
  listen       443;
  #server_name example.jp;
  
  ssl                  on;
  ssl_certificate      /etc/nginx/cert.crt;
  ssl_certificate_key  /etc/nginx/cert.key;

  ssl_session_timeout  5m;

  ssl_protocols %%%PROTOCOL%%%;
  ssl_ciphers %%%CIPHERSUITE%%%;
  %%%CIPHERORDER%%%
  # Public-Key-Pinningを有効にするにはコメントアウトを外してください
  #add_header Public-Key-Pins '%%%KEYPINNING%%%';

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
  }
}
*/}).toString().match(/\/\*([^]*)\*\//)[1],
"lighttpd":
(function() {/*
# sample lighttpd HTTPS settings - 生成されたlighttpd SSL設定ファイル
server.module += ("mod_setenv")
$SERVER["socket"] == "0.0.0.0:443" {
  ssl.engine = "enable"
  ssl.pemfile = "/etc/lighttpd/server.key"
  ssl.ca-file = "/etc/lighttpd/ca-bundle.pem"
  %%%PROTOCOL%%%
  ssl.cipher-list = "%%%CIPHERSUITE%%%"
  %%%CIPHERORDER%%%
  # TLS圧縮のフラグuse-compressionは最新版では設定エラー警告表示される
  # 古い版では設定可能
  #ssl.use-compression = "disable"
  # Public-Key-Pinningを有効にするにはコメントアウトを外してください
  #setenv.add-response-header = (
  #  "Public-Key-Pins" => "%%%KEYPINNING%%%"
  #)
  setenv.add-environment = ("HTTPS"=>"on")
}
*/}).toString().match(/\/\*([^]*)\*\//)[1],
};

/********************************************
 * ローカル関数定義
 ********************************************/
function _doGen() {
  var f1 = document.form1;

  var sCertPEM = f1.cert1.value;
  var guidename = f1.guidename.value;
  var serverapp = f1.serverapp.value;
  var cert1 = f1.cert1.value;
  var cert2 = f1.cert2.value;

  //alert(1);
  var cfg = CFG_TEMPLATE[f1.serverapp.value];
  cfg = cfg.replace("%%%PROTOCOL%%%", _getProtocolValue(guidename, serverapp));
  cfg = cfg.replace("%%%CIPHERSUITE%%%", OPENSSL_CIPHERSUITE[guidename]);

  cfg = _updateOrder(cfg, guidename, serverapp);
  cfg = _updateCompression(cfg, guidename, serverapp);
  cfg = _updatePinning(cfg, [cert1, cert2], serverapp);

  f1.resultcfg.value = cfg;
}

function _updateCompression(cfg, guidename, serverapp) {
  // 注：nginx は新しいもので対応、設定は不要
  if (guidename.indexOf("kjur") != -1 ||
      guidename.indexOf("cryptrec") != -1 ||
      guidename.indexOf("mozilla") != -1 ||
      guidename.indexOf("bullet") != -1) {
    if (serverapp.indexOf("apache") != -1) {
      cfg = cfg.replace("%%%COMPRESSION%%%", "SSLCompression off");
    }
  } else {
    if (serverapp.indexOf("apache") != -1) {
      cfg = cfg.replace("%%%COMPRESSION%%%", "#SSLCompression off");
    }
  }
  return cfg;
}

function _updateOrder(cfg, guidename, serverapp) {
  var s = "# -- cipherorder not specified for this guide --";
  if (serverapp.indexOf("kjur") != -1) s = "SSLHonorCipherOrder On";
  if (serverapp.indexOf("apache") != -1) s = "SSLHonorCipherOrder On";
  if (serverapp == "nginx")              s = "ssl_prefer_server_ciphers on;";
  if (serverapp == "lighttpd")           s = "ssl.honor-cipher-order = \"enable\"";
  if (guidename.indexOf("kjur") == -1 &&
      guidename.indexOf("cryptrec") == -1 &&
      guidename.indexOf("mozilla") == -1 &&
      guidename.indexOf("bullet") == -1) {
    cfg = cfg.replace("%%%CIPHERORDER%%%", "#" + s);
  } else {    
    cfg = cfg.replace("%%%CIPHERORDER%%%", s);
  }
  return cfg;
}

function _updatePinning(cfg, aCert, serverapp) {
  if (aCert.length == 0) {
    cfg = cfg.replace("%%%KEYPINNING%%%", "");
    return cfg;
  }

  var headerValue = _getPinHeaderValue(aCert, 60);
  if (serverapp.indexOf("apache") != -1 || serverapp == "lighttpd") {
    headerValue = headerValue.replace(/"/g, "\\\"");
  }
  cfg = cfg.replace("%%%KEYPINNING%%%", headerValue);
  return cfg;
}

function _getPinHeaderValue(aCert, nDay) {
  var a = _getCertPinArray(aCert);

  var s = "";
  for (var i = 0; i < a.length; i++) {
    s += "pin-sha256=\"" + a[i] + "\"";
  }
  if (nDay != null || nDay > 0) {
    var nSec = nDay * 24 * 60 * 60;
    s += "; max-age=" + nSec;
  }
  s += "; includeSubDomains";
  return s;
}

function _getCertPinArray(aCert) {
  var a = new Array();
  for (var i = 0; i < aCert.length; i++) {
    var c = aCert[i];
    if (c != "") a.push(_getSHA256HashB64OfCertPEM(c));
  }
  return a;
}

function _getSHA256HashB64OfCertPEM(sCertPEM) {
  var keyhex = _getPublicKeyInfoHexOfCertPEM(sCertPEM);
  var hashhex = KJUR.crypto.Util.hashHex(keyhex, "sha256");
  var hashb64 = hextob64(hashhex);
  return hashb64;
}

function _getPublicKeyInfoHexOfCertPEM(sCertPEM) {
  if (sCertPEM.indexOf("-----BEGIN PUBLIC KEY") != -1) {
    var hPubkey = ASN1HEX.pemToHex(sCertPEM);
    return hPubkey;
  } else {		      
    var hCert = ASN1HEX.pemToHex(sCertPEM);
    var pos = X509.getPublicKeyInfoPosOfCertHEX(hCert);
    var publicKeyInfoHex = ASN1HEX.getHexOfTLV_AtObj(hCert, pos);
    return publicKeyInfoHex;
  }		      
};

var LIGHTTPD_NOT_SSL2 = "ssl.use-sslv2 = \"disable\"";
var LIGHTTPD_NOT_SSL = "ssl.use-sslv2 = \"disable\"\r\n  ssl.use-sslv3 = \"disable\"";
var LIGHTTPD_TLS1112 = "ssl.use-sslv2 = \"disable\"\r\n  ssl.use-sslv3 = \"disable\"\r\n  ssl.use-tlsv1 = \"disable\"";
var LIGHTTPD_TLS12 = "ssl.use-sslv2 = \"disable\"\r\n  ssl.use-sslv3 = \"disable\"\r\n  ssl.use-tlsv1 = \"disable\"\r\n  ssl.use-tlsv1.1 = \"disable\"";

function _getProtocolValue(guideName, serverType) {
  if (serverType == "apache24" || serverType == "apache22") {
    if (guideName == "kjur201511") return "all -SSLv2 -SSLv3";
    if (guideName == "cryptrec1") return "TLSv1.2";
    if (guideName == "cryptrec2") return "all -SSLv2 -SSLv3";
    if (guideName == "cryptrec3") return "all -SSLv2";
    if (guideName == "mozilla1") return "all -SSLv3 -TLSv1";
    if (guideName == "mozilla2") return "all -SSLv3";
    if (guideName == "mozilla3") return "all";
    if (guideName == "qualysblog") return "all -SSLv2 -SSLv3";
    return "all"; // デフォルト
  }
  if (serverType == "nginx") {
    if (guideName == "kjur201511") return "TLSv1.2 TLSv1.1 TLSv1";
    if (guideName == "cryptrec1") return "TLSv1.2";
    if (guideName == "cryptrec2") return "TLSv1.2 TLSv1.1 TLSv1";
    if (guideName == "cryptrec3") return "TLSv1.2 TLSv1.1 TLSv1 SSLv3";
    if (guideName == "mozilla1") return "TLSv1.2 TLSv1.1";
    if (guideName == "mozilla2") return "TLSv1.2 TLSv1.1 TLSv1";
    if (guideName == "mozilla3") return "TLSv1.2 TLSv1.1 TLSv1 SSLv3";
    if (guideName == "qualysblog") return "TLSv1.2 TLSv1.1 TLSv1 SSLv3";
    return "TLSv1.2 TLSv1.1 TLSv1 SSLv3"; // デフォルト
  }
  if (serverType == "lighttpd") {
    if (guideName == "kjur201511") return LIGHTTPD_NOT_SSL;
    if (guideName == "cryptrec1") return LIGHTTPD_TLS12;
    if (guideName == "cryptrec2") return LIGHTTPD_NOT_SSL;
    if (guideName == "cryptrec3") return LIGHTTPD_NOT_SSL2;
    if (guideName == "mozilla1") return LIGHTTPD_TLS1112;
    if (guideName == "mozilla2") return LIGHTTPD_NOT_SSL;
    if (guideName == "mozilla3") return LIGHTTPD_NOT_SSL2;
    if (guideName == "qualysblog") return LIGHTTPD_NOT_SSL2;
    return LIGHTTPD_NOT_SSL2; // デフォルト
  }
  return "# --protocol setting not supported--";
}
</script>
</head>

<body>

<!-- HEADER -->
<div id="header_wrap" class="outer">
<header class="inner">
<h1 id="project_title">HTTPS設定ファイル生成ツール0.6(ベータ版)</h1>
<h2 id="project_tagline">各種ガイドラインに応じたApache、nginx、lighttpdなど主要なサーバーのHTTPS設定を自動生成します</h2>

<a href="https://kjur.github.io/jsrsasign/">TOP</a> | 
</header>
</div>

<!-- MAIN CONTENT -->
<div id="main_content_wrap" class="outer">
<section id="main_content" class="inner">

<!-- now editing -->
<form name="form1">

<!-- ******************************* -->
<h4>簡易設定情報</h4>
<p>
ガイドラインの種類：
<select name="guidename">
<option value="kjur201511">種々のガイドを参考に2015年11月時点での超オススメ設定(by @kjur)
<option value="cryptrec1">CRYPTREC/IPAガイド(2015.05版)高セキュリティ型 - 高いセキュリティを求める医療・金融、政府機関等向け
<option value="cryptrec2">CRYPTREC/IPAガイド(2015.05版)推奨セキュリティ型 - 標準的な設定
<option value="cryptrec3">CRYPTREC/IPAガイド(2015.05版)セキュリティ例外型 - 古いフィーチャーフォン、ゲーム機も対象に含む場合
<option value="mozilla1">Mozilla Modern Compatibility Profile - 高セキュリティ
<option value="mozilla2">Mozilla Intermediate Compatibility Profile - 中セキュリティ(デフォルト)
<option value="mozilla3">Mozilla Old Backward Compatibility Profile - 低セキュリティ
<option value="bullet1">Bulletproof SSL and TLS - recommended(中)
<option value="bullet2">Bulletproof SSL and TLS - compatibility(低)
<option value="qualysblog">Qualys社のブログによる推奨設定

<option value="openssl_default">OpenSSLデフォルト設定
<option value="redhat_default">RedHat Linuxデフォルト設定
<option value="centos6_default">CentOS 6デフォルト設定
<option value="ubuntu12_default">Ubuntu 12デフォルト設定
<option value="general_default">よくあるデフォルト設定
</select>
</p>
<p>
サーバーソフトウェアの種類：
<select name="serverapp">
<option value="apache24">Apache HTTP Server 2.4
<option value="apache22">Apache HTTP Server 2.2
<option value="nginx">nginx
<option value="lighttpd">lighttpd
</select>
</p>
<p>
a) Pinにマッチさせる証明書のPEM(SSLサーバー証明書や中間CA証明書等)<br/>
<textarea name="cert1" cols="80" rows="3"></textarea><br/>
b) Pinにマッチさせないバックアップの証明書もしくはPKCS#8公開鍵のPEM<br/>
<textarea name="cert2" cols="80" rows="3"></textarea><br/>
<br/>

</p>
<p>
<input type="button" value="生成" onClick="_doGen();"/>
<input type="reset" name="reset" value="Reset"/>
</p>

<h4>生成された設定ファイルの一部</h4>
<textarea name="resultcfg" cols="100" rows="40">
</textarea>

<h4>本ツールの説明</h4>
<p>
<a href="http://www.ipa.go.jp/security/vuln/ssl_crypt_config.html" target="_blank">
「CRYPTREC/IPA SSL/TLS暗号設定ガイドライン～安全なウェブサイトのために（暗号設定対策編）～」</a>
の発行を記念しまして、ウェブサーバーのSSL設定ファイルを生成するツールのベータ版を公開します。
本ツールは、CRYPTOREC/IPAのガイドラインで定義されている「高セキュリティ型」
「推奨セキュリティ型」「セキュリティ例外型」の設定に加え、Mozillaや他のプロファイルの
推奨設定もメニューで選ぶだけで簡単に生成できます。
</p>
<p>
現時点ではベータ版のため、
<ul>
<li>Apache 2.4系、Apache 2.2系、nginx、lighttpdのssl.conf設定ファイルしか生成できない。</li>
<li>暗号スイート、プロトコル、暗号スイート順序、TLS圧縮オフ、Public Key Pinningしか設定されない。</li>
<li>OCSP stapling、HSTSなどは未対応。(近日対応予定)</li>
</ul>
となっていますが、よかったらご利用ください。Public Key Pinningの設定に対応するためは、
SSLサーバー証明書、中間CA証明書のPEM形式でコピーペーストして頂ければ、自動的にPinningの
設定を出力します。
</p>
<p>
本ツールは、<a href="https://twitter.com/kjur">@kjur</a> が個人的に作成したものであり、CRYPTRECやIPAにより公開されているページではありません。バグ報告や問題のご指摘は<a href="https://github.com/kjur/jsrsasign/issues">こちらのバグトラッカー</a>で日本語でお知らせください。
</p>

<h4>使用方法</h4>
<p>
<ul>
<li>準拠したいガイドラインのパターンを選択します。例えば、「CRYPTREC/IPA SSL設定ガイド 推奨セキュリティ型」など選択します。</li>
<li>設定対象のウェブサーバーのソフトウェアを指定します。例えば Apache 2.4 などを選択します。</li>
<li>Certificate Pinning(Public Key Pinning)のヘッダ情報を設定したい場合には、PEMテキスト形式の証明書を
コピーペーストします。
SSLサーバー証明書からルート証明書の手前の中間CA証明書までをa) b) c)に順にコピーペーストしてください。
中間証CA証明書は2段まで対応しています。例えば、ルート＞中間＞サーバー証明書の3段である場合には、
a) b) にのみ登録し c) は空欄としてください。
</li>
<li>「生成」ボタンを押せば、ガイドに従った設定ファイル(の一部)が下に表示されます。</li>
<li>生成された設定ファイル(一部)の内容を設定し、動作確認する。</li>
</ul>
</p>

<h4>注意事項</h4>
<p>
必ずテスト環境および本番環境で、期待された動作をするかご確認ください。
</p>

<h4>参考リンク</h4>
<ul>
<li><b>ガイドライン：</b>
<ul>
<li><a href="http://www.ipa.go.jp/security/vuln/ssl_crypt_config.html" target="_blank">
CRYPTREC/IPA SSL/TLS暗号設定ガイドライン～安全なウェブサイトのために（暗号設定対策編）～</a></li>
<li><a href="https://wiki.mozilla.org/Security/Server_Side_TLS">
    Mozilla Wiki: Security/Server Side TLS</a></li>
<li><a href="https://www.feistyduck.com/books/bulletproof-ssl-and-tls/">Bulletproof SSL and TLS by Ivan Ristic
</a></li>
<li><a href="https://community.qualys.com/blogs/securitylabs/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy">QUALYS BLOG: Configuring Apache, Nginx, and OpenSSL for Forward Secrecy</a></li>
<li><a href="https://cipherli.st/">Cipherli.st: String Ciphers for Apache, nginx and Lighttpd</a></li>
<li><a href="http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-52r1.pdf">
NIST SP 800-52r1 Guidelines for the Selection, Configuration, and Use of TLS Implementation (Apr 2014)</a></li>
</ul>
</li>

<li><b>他サイトSSL設定ファイル生成ツール：</b>
<ul>
<li><a href="https://mozilla.github.io/server-side-tls/ssl-config-generator/">
    Mozilla SSL Configuration Generator</a></li>
<li><a href="https://projects.dm.id.lv/s/pkp-online/calculator.html">
JavaScript Public-Key-Pins (HPKP) calculator v1.0.2</a></li>
</ul>

<li><b>各ソフトウェアのサーバーSSL設定マニュアル：</b>
<ul>
<li><a href="http://nginx.org/en/docs/http/ngx_http_ssl_module.html">
nginx: odule ngx_http_ssl_module</a></li>
<li><a href="http://redmine.lighttpd.net/projects/1/wiki/docs_ssl">
lighttpd: Secure HTTP</a></li>
</ul>

<li><b>その他学習資料：</b>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Security/Public_Key_Pinning">
Mozilla Developper Network: Public Key Pinning</a></li>
<li><a href="https://www.nic.ad.jp/ja/materials/iw/2014/proceedings/s14/s14-urushima.pdf">
Internet Week 2014 講演資料 サーバーのSSL/TLS設定のツボ</a></li>
<li><a href="http://www.jnsa.org/seminar/pki-day/2015/data/2-1_urushima.pdf">
JNSA PKI Day 2015 講演資料 SSL/TLS生誕20年、脆弱性と対策を振返る</a></li>
<li><a href="http://blog.livedoor.jp/k_urushima/archives/1768181.html">
「RFC 7525 TLSとDTLSの安全な利用に関する推奨事項」の公開</a></li>
</ul>
</ul>

<h4>補足説明</h4>
<p>
Public Key Pinningのために、証明書をテキスト添付するのは気持ち悪いと思われるかもしれませんが、
ご安心ください。
すべての処理はブラウザのJavaScriptで行われ、サーバーに送信することもなく、
HTMLファイルとJavaScriptファイルさえあれば、オフラインでも実行することができます。
具体的には自作の<a href="https://kjur.github.io/jsrsasign/">jsrsasign</a>という、
JavaScript暗号ライブラリを使って、PEM形式のX.509証明書を解析し、SubjectPublicKeyInfoから
公開鍵を取り出し、ハッシュ計算し、Pinning用のヘッダ値を生成しています。
</p>

<h4>ニュース</h4>
<ul>
<li>2015.06.21 - 0.5ベータ版 Bulletproof SSL and TLSへの対応。SSL/TLSガイドで記載された
Certificate Pinningの記載誤り(Backup Pin)への対応</li>
<li>2015.05.16 - 0.4ベータ版 lighttpdに対応</li>
<li>2015.05.15 - 0.3ベータ版 nginxのMozillaのガイドのprotocol値の誤りの修正</li>
<li>2015.05.14 - 0.2ベータ版 nginx設定、TLS圧縮オフに対応　
(CRYPTRECガイドにはAppendixに圧縮オフ設定例はなかった)</li>
<li>2015.05.13 - 0.1ベータ版 初版公開</li>
</ul>

</form>

<!-- now editing -->

      </section>
    </div>

    <!-- FOOTER  -->
    <div id="footer_wrap" class="outer">
      <footer class="inner">
        <p class="copyright">jsrsasign maintained by <a href="https://github.com/kjur">kjur</a></p>
        <p>Published with <a href="https://pages.github.com">GitHub Pages</a></p>
<div align="center" style="color: white">
Copyright &copy; 2015 Kenji Urushima. All rights reserved.
</div>
      </footer>
    </div>

  </body>
</html>
